package com.kai.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.kai.mapper.EmpExprMapper;
import com.kai.mapper.EmpMapper;
import com.kai.pojo.*;
import com.kai.service.EmpService;
import com.kai.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {

    //DI注入
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;


    @Override
    public PageResult<Emp> page(EmpQueryParam empQueryParam) {

//        //计算开始索引
//        Integer start = (page - 1) * pageSize;
//
//        //获得员工列表
//        List<Emp> rows = empMapper.page(start, pageSize);
//
//        //获得总数
//        long total = empMapper.getTotal();


        //开启分页查询
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());

        //调用mapper接口中的方法
        //获得员工列表 开启后紧跟的第一个sql查询 会自动进行分页
        List<Emp> empList = empMapper.page(empQueryParam);

        //解析并封装查询结果
        Page<Emp> p = (Page<Emp>) empList;

        return new PageResult<Emp>(p.getTotal(),p.getResult());
    }

    @Transactional(rollbackFor = {Exception.class}) //事物管理注解
    @Override
    public void add(Emp emp) {

        //1. 添加基本信息
        //添加 创建和修改日期
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.add(emp);

        //2.添加工作经历信息
        List<EmpExpr> exprList = emp.getExprList();
        if(!exprList.isEmpty()){
            //不为空
            exprList.forEach(expr -> {
                //添加对应员工ID
                expr.setEmpId(emp.getId());
            });
            //添加员工经历
            empExprMapper.addExpr(exprList);
        }
    }

    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void deleteByIds(List<Integer> ids) {

        //1.根据id删除员工
        empMapper.deleteByIds(ids);

        //2.根据id删除经历
        empExprMapper.deleteByEmpIds(ids);
    }

    @Override
    public Emp getEmpInfoById(Integer id) {

        return empMapper.getEmpInfoById(id);
    }


    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void update(Emp emp) {

        //1.修改基本信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);

        //2.修改员工经历
        //--1 先全部删除
        empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
        //--2 再全部添加
        empExprMapper.addExpr(emp.getExprList());

    }

    @Override
    public LoginInfo login(Emp emp) {

        LoginInfo loginInfo = empMapper.selectByUsernameAndPassword(emp); //没有token

        //添加token
        if (loginInfo == null){
            return loginInfo;
        }

        //添加载荷内容---用户名-密码
        Map<String,Object> claims = new HashMap<>();
        claims.put("username",emp.getUsername());
        claims.put("password",emp.getPassword());
        //生成令牌
        String token = JwtUtils.createToken(claims);
        loginInfo.setToken(token);

        //添加成功
        return loginInfo;
    }

}
